﻿CREATE PROCEDURE [dbo].[LedgerOperationsDelete]
(--список операций для формирования проводок для импорта в 1С
	@Original_Id int,
	@Original_MD datetime,
	@MW varchar(50) -- если = PhysicallyDelete то запись удаляется физически. В противном случае поле ToDelete устанавливается в 1
)
AS
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int
DECLARE @intLineId int, @datLineMD datetime
DECLARE @datMD datetime, @intDepartmentId int, @bitPhysicallyDelete bit

	SET NOCOUNT ON;

SELECT @intRet = Id
FROM [CO].LedgerOperations WHERE Id = @Original_Id AND MD = @Original_MD
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 1, 
	@strMsg = 'Данные изменены после последнего запроса!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

--Проверка возможности физического удаления записи из таблиц справочников
EXEC @intRet = dbo.CheckDictionaryDelete @bitPhysicallyDelete OUTPUT, @intDepartmentId OUTPUT, @MW OUTPUT
IF @intRet <> 0 RETURN @intRet

--удаление списка типов проводок для данной операции
DECLARE TransForOperations CURSOR FAST_FORWARD FOR
SELECT Id, MD FROM [CO].LedgerOperationsVsTransTypes WHERE LedgerOperationId = @Original_Id

OPEN TransForOperations

FETCH NEXT FROM TransForOperations INTO @intLineId, @datLineMD
BEGIN TRAN

WHILE (@@FETCH_STATUS = 0)
BEGIN

		EXEC @intRet = dbo.LedgerOperationsVsTransTypesDelete @intLineId, @datLineMD
	
		SET @intErrCode = @@error
		IF @intErrCode <> 0
		BEGIN 
			IF @@trancount > 0 ROLLBACK TRANSACTION
			CLOSE TransForOperations
			DEALLOCATE TransForOperations
			RETURN @intErrCode
		END
		
		IF @intRet <> 0
		BEGIN 
			IF @@trancount > 0 ROLLBACK TRANSACTION
			CLOSE TransForOperations
			DEALLOCATE TransForOperations
			RETURN @intRet
		END
	
	FETCH NEXT FROM TransForOperations INTO @intLineId, @datLineMD
END

CLOSE TransForOperations
DEALLOCATE TransForOperations

EXEC [dbo].[ProcessStatistic] Null, @datMD OUTPUT, @MW OUTPUT

	SET NOCOUNT OFF;

IF @intDepartmentId <> 0 --в поздразделениях запись всегда физически удаляется
	DELETE FROM [CO].LedgerOperations WHERE Id = @Original_Id
ELSE
BEGIN
	IF @bitPhysicallyDelete = 1
		DELETE FROM [CO].LedgerOperations WHERE Id = @Original_Id
	ELSE --Обычные пользователи только помечают запись для удаления
		UPDATE [CO].LedgerOperations SET 
		ToDelete = 1,
		[MD] = @datMD, [MW] = @MW
		WHERE Id = @Original_Id
END

SET @intErrCode = @@error
IF @intErrCode <> 0
BEGIN 
	IF @@trancount > 0 ROLLBACK TRANSACTION
	RETURN @intErrCode
END

COMMIT TRAN

RETURN 0
